package negocio;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

import beans.PedidoVO;
import beans.PlatoVO;

@Entity
@Table(name="pedidos")
public class Pedido implements Serializable  
{
	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="id_pedido", nullable=false)
	private int id_pedido;
	
	@ManyToMany(cascade=CascadeType.MERGE, fetch = FetchType.EAGER)
	@JoinColumn(name="id_pedido", referencedColumnName="id_pedido")
	private Set<Plato> platos = new HashSet<Plato>();
	
	@Column(name="estado", nullable=false)
	private String estado;
	
	@Column(name="facturable", nullable=false)
	private boolean facturable;
	
	
	public Set<Plato> getPlatos() {
		return platos;
	}
	public void setPlatos(Set<Plato> platos) {
		this.platos = platos;
	}
	public String getEstado() {
		return estado;
	}
	public void setEstado(String estado) {
		this.estado = estado;
	}
	public boolean isFacturable() {
		return facturable;
	}
	public void setFacturable(boolean facturable) {
		this.facturable = facturable;
	}
	
	
	@Override
	public String toString() {
		return "Pedido [id_pedido=" + id_pedido + ", platos=" + platos
				+ ", estado=" + estado + ", facturable=" + facturable + "]";
	}
	
	
	//hashcode and equals
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((estado == null) ? 0 : estado.hashCode());
		result = prime * result + (facturable ? 1231 : 1237);
		result = prime * result + id_pedido;
		result = prime * result + ((platos == null) ? 0 : platos.hashCode());
		return result;
	}
	
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Pedido other = (Pedido) obj;
		if (estado == null) {
			if (other.estado != null)
				return false;
		} else if (!estado.equals(other.estado))
			return false;
		if (facturable != other.facturable)
			return false;
		if (id_pedido != other.id_pedido)
			return false;
		if (platos == null) {
			if (other.platos != null)
				return false;
		} else if (!platos.equals(other.platos))
			return false;
		return true;
	}
	
	public void buildFromVO(PedidoVO pedidoVO)
	{
		this.estado = pedidoVO.getEstado();
		this.facturable = pedidoVO.isFacturable();
		
		ArrayList<Plato> plat = new ArrayList<Plato>();
		for (int i = 0 ; i < pedidoVO.getPlatos().size() ; i++)
		{
			Plato p = new Plato();
			p.buildFromVO(pedidoVO.getPlatos().get(i));
			plat.add(p);
		}
		
		for(Plato p : plat)
			this.platos.add(p);
	}
	
	public PedidoVO getVO()
	{
		PedidoVO pedVO = new PedidoVO();
		pedVO.setEstado(this.getEstado());
		pedVO.setFacturable(this.isFacturable());
		
		ArrayList<PlatoVO> patosVOs = new ArrayList<PlatoVO>();
		
		for(Plato p: this.getPlatos()){
			PlatoVO platoVO=p.getVO();
			patosVOs.add(platoVO);
		}
		
		return pedVO;
	}
	public int getId_pedido() {
		return id_pedido;
	}
	public void setId_pedido(int id_pedido) {
		this.id_pedido = id_pedido;
	}
	
	
	
	
	
	
	
	
	
	
}
